const axios = require('axios');

// 最终验证PLC服务访问控制的测试脚本

async function testDirectPLCReadAccess() {
    try {
        console.log('测试直接访问PLC读取API...');
        
        // 尝试直接调用PLC服务
        const response = await axios.post('http://localhost:3002/api/plc/read', {
            variables: ['DB122,X0.6']
        }, {
            headers: {
                'User-Agent': 'Test Client'
            }
        });
        
        console.log('❌ 直接访问PLC服务应该被拒绝，但返回了:', response.data);
        return false;
    } catch (error) {
        if (error.response && error.response.status === 403) {
            console.log('✅ 直接访问PLC服务被正确拒绝:', error.response.data.message);
            return true;
        } else {
            console.log('⚠️  直接访问PLC服务返回了意外的错误:', error.message);
            return false;
        }
    }
}

async function testQueueServicePLCReadAccess() {
    try {
        console.log('测试通过队列服务访问PLC读取API...');
        
        // 通过队列服务调用PLC服务
        const response = await axios.post('http://localhost:3003/api/queue/task', {
            task: {
                type: 'plc-read',
                variables: ['DB122,X0.6']
            }
        });
        
        console.log('✅ 通过队列服务访问PLC服务成功:', response.data);
        return true;
    } catch (error) {
        console.error('❌ 通过队列服务访问PLC服务失败:', error.message);
        return false;
    }
}

async function testPublicEndpointAccess() {
    try {
        console.log('测试访问PLC公共端点...');
        
        // 访问PLC状态端点（应该是公共的）
        const response = await axios.get('http://localhost:3002/api/plc/status');
        
        console.log('✅ 访问PLC公共端点成功:', response.data);
        return true;
    } catch (error) {
        console.error('❌ 访问PLC公共端点失败:', error.message);
        return false;
    }
}

async function runFinalValidation() {
    try {
        console.log('开始最终验证PLC服务访问控制...\n');
        
        // 测试直接访问应该被拒绝
        const directAccessBlocked = await testDirectPLCReadAccess();
        console.log('\n-------------------\n');
        
        // 测试通过队列服务访问应该成功
        const queueAccessAllowed = await testQueueServicePLCReadAccess();
        console.log('\n-------------------\n');
        
        // 测试公共端点应该可以访问
        const publicAccessAllowed = await testPublicEndpointAccess();
        console.log('\n-------------------\n');
        
        if (directAccessBlocked && queueAccessAllowed && publicAccessAllowed) {
            console.log('🎉 所有验证通过！PLC服务现在只接受队列服务的请求。');
        } else {
            console.log('❌ 验证失败！PLC服务访问控制未正确配置。');
        }
    } catch (error) {
        console.error('验证过程中出现错误:', error.message);
    }
}

// 如果直接运行此脚本，则执行验证
if (require.main === module) {
    runFinalValidation();
}

module.exports = {
    testDirectPLCReadAccess,
    testQueueServicePLCReadAccess,
    testPublicEndpointAccess,
    runFinalValidation
};